home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / DEMON / LANGUAGE / POTSRC.ARC / src / mod / cocq < prev    next >
Text File  |  1995-01-22  |  2KB  |  78 lines

  1. MODULE COCQ; (* DT 21 10 1993 23:39 *)
  2.   IMPORT Strings, COCS, COCT, COCO;
  3.  
  4.   CONST MaxCSeqLen = 4095; 
  5.  
  6.   VAR
  7.     CSeq, Dup: ARRAY MaxCSeqLen + 1 OF CHAR; (* designator buffer *)
  8.     cslen*: INTEGER;
  9.  
  10.  (* Error 215  - simplify expression *)
  11.  
  12.   PROCEDURE Append*(sfx: ARRAY OF CHAR);
  13.     VAR i, sfxlen: INTEGER;
  14.   BEGIN sfxlen := SHORT(Strings.Length(sfx));
  15.     IF sfxlen + cslen > MaxCSeqLen THEN COCS.Mark(215); RETURN END;
  16.     i := 0; 
  17.     LOOP CSeq[i + cslen] := sfx[i]; 
  18.       IF i = sfxlen THEN EXIT END;
  19.       INC(i) 
  20.     END;
  21.     INC(cslen, sfxlen)
  22.   END Append;
  23.     
  24.   PROCEDURE Prepend*(pfx: ARRAY OF CHAR; pos: INTEGER; VAR nextpos: INTEGER); 
  25.     VAR i, pfxlen: INTEGER;
  26.   BEGIN IF pos = cslen THEN Append(pfx); nextpos := cslen; RETURN END;
  27.     pfxlen := SHORT(Strings.Length(pfx));
  28.     IF pfxlen + cslen > MaxCSeqLen THEN COCS.Mark(215); i := pos
  29.     ELSE
  30.       i := cslen + 1; WHILE i # pos DO DEC(i); CSeq[i + pfxlen] := CSeq[i] END;
  31.       WHILE i # pos + pfxlen DO CSeq[i] := pfx[i - pos]; INC(i) END;
  32.       INC(cslen, pfxlen);
  33.     END;
  34.     nextpos := i
  35.   END Prepend;
  36.  
  37.   PROCEDURE Rewind*;
  38.   BEGIN CSeq[0] := 0X; cslen := 0 
  39.   END Rewind;
  40.   
  41.   PROCEDURE Drop*(VAR x: COCT.Item);     
  42.   BEGIN cslen := x.qoffs; CSeq[cslen] := 0X; x.qoffs := -1
  43.   END Drop;
  44.                     
  45.   PROCEDURE Link*(VAR x: COCT.Item);
  46.   BEGIN x.qoffs := cslen
  47.   END Link;
  48.  
  49.   PROCEDURE Unlink*(VAR x: COCT.Item);
  50.   BEGIN IF x.qoffs = 0 THEN COCO.PutSeq(CSeq); Rewind END; x.qoffs := -1
  51.   END Unlink;
  52.   
  53.   PROCEDURE Mark*(VAR x: COCT.Item);
  54.   BEGIN x.qoffs := cslen
  55.   END Mark;
  56.  
  57.   PROCEDURE Release*(VAR x: COCT.Item);
  58.     VAR i: INTEGER;
  59.   BEGIN cslen := x.qoffs;
  60.     IF cslen # 0 THEN
  61.       i := 0;
  62.       LOOP Dup[i] := CSeq[i + cslen];
  63.         IF Dup[i] = 0X THEN EXIT END;
  64.         INC(i)
  65.       END;
  66.       CSeq[cslen] := 0X;
  67.       COCO.PutSeq(Dup)
  68.     ELSE COCO.PutSeq(CSeq); CSeq[0] := 0X
  69.     END;
  70.     x.qoffs := -1
  71.   END Release;
  72.  
  73.   PROCEDURE Dummy*();
  74.   BEGIN IF cslen = 0 THEN Append(" ") END
  75.   END Dummy;
  76.  
  77. END COCQ.
  78.